#include <QApplication>
#include <QDebug>
#include <QThread>
#include <QtConcurrent>
#include <QByteArray>
#include <QList>

void fun1(){
    qDebug()<<__FUNCTION__<<QThread::currentThread();
}

void fun2(QString str1, QString str2){
    qDebug()<<__FUNCTION__<<str1+str2<<QThread::currentThread();
}

int fun3(int i, int j){
    qDebug()<<__FUNCTION__<<QThread::currentThread();
    return i+j;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qDebug()<<__FUNCTION__<<QThread::currentThread();

    //无参数的普通函数
    QFuture<void> fut1 = QtConcurrent::run(fun1);

    //有参数的普通函数
    QFuture<void> fut2 = QtConcurrent::run(fun2, QString("Thread"),QString(" 2"));

    //获取普通函数的返回值
    int i=1, j=2;
    QFuture<int> fut3 = QtConcurrent::run(fun3, i, j);
    qDebug()<<"ret:"<<fut3.result();

    //以上的例子，如果要为其指定线程池，可以将线程池的指针作为第一个参数传递进去
    QThreadPool pool;
    QFuture<void> fut4 = QtConcurrent::run(&pool, fun1);

    fut1.waitForFinished();
    fut2.waitForFinished();
    fut3.waitForFinished();
    fut4.waitForFinished();


    //常量成员函数QByteArray::split()
    QByteArray bytearray = "hello,world";
    QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
    QList<QByteArray> result = future.result();
    qDebug()<<"result:"<<result;

    return a.exec();
}
